Skip to main content

Coding5 - 📋 Task Management Features

MethodEndpointDescription
POST/api/tasksCreate a new task
GET/api/tasksGet all tasks (with optional filters)
GET/api/tasks/:taskIdGet a specific task by ID
PUT/api/tasks/:taskIdUpdate a task (e.g., due date, priority, etc)
DELETE/api/tasks/:taskIdDelete a task

✅ Step 1: Create the Task Model

File: src/model/task.model.ts

import mongoose, { Schema, Document } from 'mongoose';

export interface ITask extends Document {
title: string;
description?: string;
dueDate?: Date;
priority?: 'low' | 'medium' | 'high';
isCompleted: boolean;
userId: mongoose.Types.ObjectId;
}

const TaskSchema: Schema<ITask> = new Schema({
title: { type: String, required: true },
description: String,
dueDate: Date,
priority: { type: String, enum: ['low', 'medium', 'high'], default: 'medium' },
isCompleted: { type: Boolean, default: false },
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
}, { timestamps: true });

export default mongoose.model<ITask>('Task', TaskSchema);

✅ Step 2: Create the Task Controller

File: src/controller/task.controller.ts

import { Request, Response } from 'express';
import Task from '../model/task.model';

// Create new task
export const createTask = async (req: Request, res: Response) => {
try {
const newTask = await Task.create(req.body);
res.status(201).json(newTask);
} catch (error) {
res.status(400).json({ message: 'Failed to create task', error });
}
};

// Get all tasks (optionally filter by due date or priority)
export const getAllTasks = async (req: Request, res: Response) => {
try {
const filter: any = {};
if (req.query.priority) filter.priority = req.query.priority;
if (req.query.dueDate) filter.dueDate = req.query.dueDate;

const tasks = await Task.find(filter);
res.json(tasks);
} catch (error) {
res.status(500).json({ message: 'Failed to fetch tasks', error });
}
};

// Get single task by ID
export const getTaskById = async (req: Request, res: Response) => {
try {
const task = await Task.findById(req.params.taskId);
if (!task) return res.status(404).json({ message: 'Task not found' });
res.json(task);
} catch (error) {
res.status(500).json({ message: 'Error fetching task', error });
}
};

// Update a task by ID
export const updateTask = async (req: Request, res: Response) => {
try {
const updatedTask = await Task.findByIdAndUpdate(req.params.taskId, req.body, { new: true });
if (!updatedTask) return res.status(404).json({ message: 'Task not found' });
res.json(updatedTask);
} catch (error) {
res.status(400).json({ message: 'Failed to update task', error });
}
};

// Delete a task by ID
export const deleteTask = async (req: Request, res: Response) => {
try {
const deletedTask = await Task.findByIdAndDelete(req.params.taskId);
if (!deletedTask) return res.status(404).json({ message: 'Task not found' });
res.json({ message: 'Task deleted successfully' });
} catch (error) {
res.status(500).json({ message: 'Failed to delete task', error });
}
};

✅ Step 3: Create Task Routes

File: src/routes/task.routes.ts

import { Router } from 'express';
import {
createTask,
getAllTasks,
getTaskById,
updateTask,
deleteTask
} from '../controller/task.controller';

const router = Router();

router.post('/', createTask);
router.get('/', getAllTasks);
router.get('/:taskId', getTaskById);
router.put('/:taskId', updateTask);
router.delete('/:taskId', deleteTask);

export default router;

✅ Step 4: Register Routes in app.ts

File: src/app.ts

Add this line under your auth routes:

import taskRoutes from './routes/task.routes';
app.use('/api/tasks', taskRoutes);

✅ Resulting API Endpoints

MethodEndpointDescription
POST/api/tasksCreate a task
GET/api/tasksGet all tasks (filters)
GET/api/tasks/:taskIdGet a specific task
PUT/api/tasks/:taskIdUpdate a task
DELETE/api/tasks/:taskIdDelete a task